iT邦幫忙

2023 iThome 鐵人賽

DAY 5
1
自我挑戰組

轉職新手學 Django 及 DRF系列 第 5

Day 5 - 建立 app 及自定義 User model

  • 分享至 

  • xImage
  •  

一個 Django 專案可由一個或多個 app 組成,而 app 是提供特定功能或是功能性的模組單位,可以把 Django 想像成一間公司,而其中的每個不同部門就是 app,若專案較為複雜,就需要多個 app 來負責不同的功能及職責;反之簡單的專案有時可用一個 app 就能涵蓋所有需求。

建立第一個 app

首先啟動虛擬環境,在專案資料夾內輸入以下指令:

python manage.py startapp <app_name>

app_name 可自行定義,輸入完畢後系統便會自動生成一個內含許多檔案的資料夾,這邊我創建一個名為 core 的 app,可以看到以下資料夾及檔案:

core/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

自動生成這些檔案是為了減少創建資料夾及檔案的時間及心力,能比較專注在程式碼上。創建一個新 app 必須登入在 settings.py 中的INSTALLED_APP中,才能正常運作:

INSTALLED_APPS = [
    # 其他應用程式
    'core',
]

儲存後即完成設定,接著來建立第一個資料表。

models.py

可用於建立資料庫的資料表,使用 class 定義資料表結構,而當使用者發送請求時,由 view 進行處理,接著把 model 中的資料拿出來回應給使用者,所以model.py是個很重要的檔案,在定義資料表結構時也必須謹慎。

建議在每次 models.py 有更動時都執行一次python manage.py makemigrationspython manage.py migrate,避免產生錯誤。

自定義 User model

很多網站都會使用到 User 的操作功能,因此 Django 也有預設的 model 可使用,不過在預設中是使用 username 以及 password 來進行登入,跟大多實際情況用 email 好像不太一樣? 沒關係!!那就自己來做一個吧!在 Django 的文件中也推薦自定義一個 User model。參考文件

進入 core/models.py,為此專案建立以 email 取代 username 的 User model:

from django.db import models
from django.contrib.auth.models import (
    AbstractBaseUser,
    BaseUserManager,
    PermissionsMixin,
)

# 建立有創建 user 及 superuser 函式的 class,需要繼承自 BaseUserManager
class UserManager(BaseUserManager):

    # 定義創建一般使用者的函式
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('User must have an email address.')
        user = self.model(email=self.normalize_email(email), **extra_fields)
        user.set_password(password)
        user.save(using=self._db)

        return user

    # 定義創建管理員的函式
    def create_superuser(self, email, password):
        user = self.create_user(email, password)
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)

        return user


# 定義 User 的資料表內容、資料類型及相關設定
class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    # 將 UserManager 指派到 User model 中
    objects = UserManager()

    # 指定使用 email 當作 username
    USERNAME_FIELD = 'email'

寫完上面程式碼後,執行下列程式碼,進行資料庫更新:

python manage.py makemigrations
python manage.py migrate

最後,進入 app/settings.py 的底部配置此 model:

# 其他程式碼
AUTH_USER_MODEL = 'core.User'

如此便大功告成!!之後創建的使用者或是管理員就會依照此資料表建立

結語

什麼?你說你不知道管理員?沒關係!下一篇告訴你,明天見~


上一篇
Day 4 - 專案裡的那些檔案
下一篇
Day 6 - Django 的管理者頁面
系列文
轉職新手學 Django 及 DRF30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言